package com.stefanini.pe.bbva.bp.in.controller;

import java.net.InetAddress;
import java.net.UnknownHostException;

import java.util.HashMap;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ComponentSystemEvent;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.primefaces.component.menuitem.MenuItem;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.bo.iface.ClienteBOIface;
import com.stefanini.pe.bbva.bp.in.bo.iface.ParametrosBOIface;
import com.stefanini.pe.bbva.bp.in.bo.impl.ClienteBOImpl;
import com.stefanini.pe.bbva.bp.in.bo.impl.ParametrosBOImpl;

import com.stefanini.pe.bbva.bp.in.model.LoginModel;
import com.stefanini.pe.bbva.bp.in.security.AuthorizationService;
import com.stefanini.pe.bbva.bp.in.to.NoCliente;
import com.stefanini.pe.bbva.bp.in.to.UsuarioSesion;
import com.stefanini.pe.bbva.bp.in.utils.SpringApplicationContext;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@ManagedBean
@SessionScoped
public class NoClienteController extends GenericoController {
	private ClienteBOIface clienteBO;
	private LoginModel loginModel;
	
	private NoCliente noCliente;
	private NoCliente noClienteEdit;
	private NoCliente noClienteNuevo;

	private String criterioBusqueda;
	private String valorBusqueda;
	private List<NoCliente> listaConsultaGeneral;

	private Integer activeIndex;

	private HashMap datosBasicos;
	private List tiposCambio;
	
	public void onPageLoad(ComponentSystemEvent event) {
		try {
			AuthorizationService auth = (AuthorizationService)SpringApplicationContext.getBean("authorizationService");
			if (auth.isSessionUserAndContextValide() && !FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("NoClienteController... is not Postback");

				LoginController loginContr = (LoginController)getHttpSession().getAttribute("loginController");
				loginModel = loginContr.getLoginModel();
				
				clienteBO = (ClienteBOImpl)SpringApplicationContext.getBean("clienteBO");
				
				activeIndex = 0;
				criterioBusqueda = "";
				valorBusqueda = "";
				initAll();
				buscarCliente();
			}
		} catch (Exception e) {
			e.printStackTrace();
			mostrarError("Error interno. "+Util.obtenerMensajeError(e));
		}
	}
	
	private void initAll(){
		datosBasicos = null;
		tiposCambio = null;
		noCliente = new NoCliente();
		noClienteEdit=new NoCliente();
		listaConsultaGeneral = null;
	}
	
	public void buscarCliente() {
		try{
			noCliente.setTipdoc(getCriterioBusqueda()==null?"":(getCriterioBusqueda().equals("0")?"":getCriterioBusqueda()));
			noCliente.setNrodoc(getValorBusqueda()!=null?getValorBusqueda().trim():"");
			setListaConsultaGeneral(clienteBO.listarNoClientes(noCliente));
			getSessionMap().put("listaConsultaGeneralNoCliente", listaConsultaGeneral);
		}
		catch(Exception e){
			e.printStackTrace();
			mostrarError("Error interno. "+Util.obtenerMensajeError(e));
		}
	}
	
	public void verDetalleCliente(Object ob){
		try {
		    NoCliente noClienteSession = (NoCliente)ob;
		    getHttpSession().setAttribute(Constantes.OBJETO_NO_CLIENTE_SESSION, noClienteSession);
			cargarDatosBasicos();
			cargarDatosAdicionales();
			Util.redirect("/pages/noCliente/HistoricoPerfilarNC.xhtml");
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void cargarDatosBasicos(){
		try{
			NoCliente noSCliente = (NoCliente)getHttpSession().getAttribute(Constantes.OBJETO_NO_CLIENTE_SESSION);
			List<NoCliente> list = clienteBO.getDatosBasicosNoCliente(noSCliente);
			
			NoCliente noCliente = null;
			if(list != null && list.size() > 0){
				noCliente = list.get(0);
			}else{
				noCliente = noSCliente;
			}
			
			HashMap datosNoCl = new HashMap();
			datosNoCl.put("razonSocial", noCliente.getNombrerazonSocial()!=null?noCliente.getNombrerazonSocial():"");
			datosNoCl.put("tipoDocumento", noCliente.getDestipdoc()!=null?noCliente.getDestipdoc():"");
			datosNoCl.put("nroDocumento", noCliente.getNrodoc()!=null?noCliente.getNrodoc():"");
			datosNoCl.put("perfil", noCliente.getPerfil()!=null?noCliente.getPerfil():"");
			datosBasicos = datosNoCl;
			getHttpSession().setAttribute(Constantes.OBJETO_NO_CLIENTE_SESSION, noCliente);
			
			getSessionMap().put("datosBasicos",datosNoCl);
			
			ParametrosBOIface parametrosBO = (ParametrosBOImpl)SpringApplicationContext.getBean("parametrosBO");
			tiposCambio = parametrosBO.listaTiposCambio();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	private void cargarDatosAdicionales() {
		try{
			HashMap datosAdicionales = new HashMap();
			UsuarioSesion usuarioSesion = (UsuarioSesion)getSession().getAttribute(Constantes.USUARIO_SESSION);
			datosAdicionales.put("nombregestorpremium", Util.getStringF(usuarioSesion.getCodigoUsuario())+" - "+usuarioSesion.retornaNombreCompleto());
			datosAdicionales.put("emailgestorpremium", Util.getStringF(usuarioSesion.getEmail()));
			datosAdicionales.put("telefonogestorpremium", Util.getStringF(usuarioSesion.getTelefono()));
			getSessionMap().put("datosAdicionales", datosAdicionales);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void nuevoNoClienteReset(){
		noClienteNuevo = new NoCliente();
	}

	public void grabarNuevoCliente(){
		String msgPopupWarn ="";
		String msgPopupError ="";
		String msgMainWarn = "";
		try{
			UsuarioSesion usuarioSesion=(UsuarioSesion)getHttpSession().getAttribute(Constantes.USUARIO_SESSION);			
			String tipoDocumento = noClienteNuevo.getTipdoc().equals("0")?"":noClienteNuevo.getTipdoc();
			String nroDocumento = noClienteNuevo.getNrodoc()==null || noClienteNuevo.getNrodoc().trim().equals("")?"":noClienteNuevo.getNrodoc();
			String razonSocial = noClienteNuevo.getNombrerazonSocial()==null || noClienteNuevo.getNombrerazonSocial().trim().equals("")?"":noClienteNuevo.getNombrerazonSocial();
			String email = noClienteNuevo.getEmail()==null || noClienteNuevo.getEmail().trim().equals("")?"":noClienteNuevo.getEmail();

			noClienteNuevo.setCodregcrea(((UsuarioSesion)loginModel.getUsuarioSesion()).getCodigoUsuario());
			noClienteNuevo.setTerminacrea(getTerminal());

			if(tipoDocumento.equals("")){
				msgPopupWarn = "Seleccione tipo documento";
			}else if(nroDocumento.equals("")){
				msgPopupWarn = "Ingrese nro. documento";
			}else if(razonSocial.equals("")){
				msgPopupWarn = "Ingrese razon social";
			}else if(email.equals("")){
				msgPopupWarn = "Ingrese email";
			}else{
				int numEmailPermitidos = 1;
				try{
					numEmailPermitidos = Integer.parseInt(Util.leerConfig("NUMBER_OF_EMAIL_CONS_NOCLIENTE"));
				}catch (Exception e) {
					e.printStackTrace();
				}
				String[] valuesResult = Util.valideEmail(email,true,"Mail",Constantes.SEPARADOR_PUNTO_COMA, new Integer(numEmailPermitidos));
				if(valuesResult[0].length() > 0) {
					msgPopupWarn = valuesResult[0];
				}else{
					noClienteNuevo.setEmail(valuesResult[1]);
					HashMap map = clienteBO.crearNoCliente(noClienteNuevo,usuarioSesion);
					//Validando retorno de accion
					String resp = (String)map.get("result");
					if(resp.equals("ok")){
						buscarCliente();
					}else{					
						msgPopupError = "El Cliente ya existe.";
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
			msgPopupError = "Error interno. "+Util.obtenerMensajeError(e);
		}
		
		String[] idsMain={"formPrincipal:messages","formPrincipal:tablaNoClientes"};
		String[] idsPopup={"formNuevoNoCliente:new_messages2"};
		String argClosePopup="bandGrabarNewNoCliente";
		messageSaveToPopupOrMain(msgMainWarn, msgPopupWarn, msgPopupError, idsMain, idsPopup, argClosePopup, true);
	}
	
	public void editarCliente(Object ob){
		noClienteEdit = (NoCliente)ob;
	}
	
	public void grabarEditarCliente(){
		String msgPopupWarn ="";
		String msgPopupError ="";
		String msgMainWarn = "";
		try{
			UsuarioSesion usuarioSesion=(UsuarioSesion)getHttpSession().getAttribute(Constantes.USUARIO_SESSION);
			String tipoDocumento = noClienteEdit.getTipdoc().equals("0")?"":noClienteEdit.getTipdoc();
			String nroDocumento = noClienteEdit.getNrodoc()==null || noClienteEdit.getNrodoc().trim().equals("")?"":noClienteEdit.getNrodoc();
			String razonSocial = noClienteEdit.getNombrerazonSocial()==null || noClienteEdit.getNombrerazonSocial().trim().equals("")?"":noClienteEdit.getNombrerazonSocial();
			String email = noClienteEdit.getEmail()==null || noClienteEdit.getEmail().trim().equals("")?"":noClienteEdit.getEmail();
			
			noClienteEdit.setCodregmodi(((UsuarioSesion)loginModel.getUsuarioSesion()).getCodigoUsuario());
			noClienteEdit.setTerminalmodi(getTerminal());
			
            if(tipoDocumento.equals("")){
            	msgPopupWarn = "Seleccione tipo documento";
			}else if(nroDocumento.equals("")){
				msgPopupWarn = "Ingrese nro. documento";
			}else if(razonSocial.equals("")){
				msgPopupWarn = "Ingrese razon social";
			}else if(email.equals("")){
				msgPopupWarn = "Ingrese email";
			}else{
				int numEmailPermitidos = 1;
				try{
					numEmailPermitidos = Integer.parseInt(Util.leerConfig("NUMBER_OF_EMAIL_CONS_NOCLIENTE"));
				}catch (Exception e) {
					e.printStackTrace();
				}
				String[] valuesResult = Util.valideEmail(email,true,"Mail",Constantes.SEPARADOR_PUNTO_COMA, new Integer(numEmailPermitidos));
				if(valuesResult[0].length() > 0) {
					msgPopupWarn = valuesResult[0];
				}else{
					noClienteEdit.setEmail(valuesResult[1]);
					HashMap map = clienteBO.editarNoCliente(noClienteEdit, usuarioSesion);
					String resp = (String)map.get("result"); 
					if(resp.equals("ok")){
						buscarCliente();
					}else{					
						msgPopupError ="El Cliente ya existe.";
					}
				}
			}	
		}catch(Exception e){
			e.printStackTrace();
			msgPopupError="Error interno. "+Util.obtenerMensajeError(e);
		}
		
		String[] idsMain={"formPrincipal:messages","formPrincipal:tablaNoClientes"};
		String[] idsPopup={"formEditar:new_messages"};
		String argClosePopup="bandGrabarEditNoCliente";
		messageSaveToPopupOrMain(msgMainWarn, msgPopupWarn, msgPopupError, idsMain, idsPopup, argClosePopup, true);
	}
	
	private String getTerminal(){
		String ip=((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr();
		try {
			return InetAddress.getByName(ip).getHostAddress();
		} catch (UnknownHostException e) {
			e.printStackTrace();
			return "";
		}
	}
  
	public void changeIndexMenuNoCliente(ActionEvent event){
		MenuItem selectedMenuItem = (MenuItem) event.getComponent();
		activeIndex = (Integer)selectedMenuItem.getAttributes().get("idobjectIndex");
		Util.redirect((String)selectedMenuItem.getAttributes().get("idobjectURL"));
	}
	
	/***************************** ***************/
	private HttpSession getSession(){
		FacesContext context = FacesContext.getCurrentInstance();
		return (HttpSession)context.getExternalContext().getSession(false);
	}
	/***************************** ***************/
	
	public List<NoCliente> getListaConsultaGeneral() {
		return listaConsultaGeneral;
	}

	public void setListaConsultaGeneral(List<NoCliente> listaConsultaGeneral) {
		this.listaConsultaGeneral = listaConsultaGeneral;
	}

	public NoCliente getNoCliente() {
		return noCliente;
	}

	public void setNoCliente(NoCliente noCliente) {
		this.noCliente = noCliente;
	}

	public NoCliente getNoClienteEdit() {
		return noClienteEdit;
	}

	public void setNoClienteEdit(NoCliente noClienteEdit) {
		this.noClienteEdit = noClienteEdit;
	}

	public NoCliente getNoClienteNuevo() {
		return noClienteNuevo;
	}

	public void setNoClienteNuevo(NoCliente noClienteNuevo) {
		this.noClienteNuevo = noClienteNuevo;
	}
	
	public String getCriterioBusqueda() {
		return criterioBusqueda;
	}

	public void setCriterioBusqueda(String criterioBusqueda) {
		this.criterioBusqueda = criterioBusqueda;
	}

	public String getValorBusqueda() {
		return valorBusqueda;
	}

	public void setValorBusqueda(String valorBusqueda) {
		this.valorBusqueda = valorBusqueda;
	}
	
	public Integer getActiveIndex() {
		return activeIndex;
	}

	public void setActiveIndex(Integer activeIndex) {
		this.activeIndex = activeIndex;
	}

	public HashMap getDatosBasicos() {
		return datosBasicos;
	}

	public void setDatosBasicos(HashMap datosBasicos) {
		this.datosBasicos = datosBasicos;
	}

	public List getTiposCambio() {
		return tiposCambio;
	}

	public void setTiposCambio(List tiposCambio) {
		this.tiposCambio = tiposCambio;
	}
}